package model;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;

import model.Stichtag;

@SuppressWarnings("serial")
public class StichtagRepository extends ArrayList<Stichtag> {

	/** Instanz des StichtagRepository. */
	private static StichtagRepository stichtagRepository = null;

	/** Die Datenbankschnittstelle. */
	private static DatenbankSchnittstelle datenbankSchnittstelle;

	/**
	 * Stellt die Verbindung zur Datenbank her und füllt sich selber mit
	 * Einträgen.
	 * 
	 * @throws SQLException
	 * @throws ClassNotFoundException
	 * 
	 */
	private StichtagRepository() throws SQLException, ClassNotFoundException {
		datenbankSchnittstelle = DatenbankSchnittstelle.getInstance();
		addArray(datenbankSchnittstelle.getStichtag());
		System.out.println("Stichtag Repository geladen");
	}

	/**
	 * Fügt der Arraylist ein Stichtag-Array zu.
	 * 
	 * @param stichtag
	 *            die Stichtage
	 */
	private void addArray(Stichtag[] stichtag) {
		for (int i = 0; i < stichtag.length; i++) {
			this.add(stichtag[i]);

		}
	}

	/**
	 * Liefert einen Stichtag nach ID zurück.
	 * 
	 * @param id
	 *            die ID des gesuchten Stichtags
	 * @return bei erfolgreicher Suche der gesuchte Stichtag, sonst
	 *         <code>null</code>
	 */
	public Stichtag getStichtagNachId(int id) {
		for (int i = 0; i < this.size(); i++) {
			if (this.get(i).getId() == id) {
				return this.get(i);
			}
		}
		return null;
	}


	/**
	 * Erstellt einen neuen Benutzer.
	 * 
	 * @param stichtag
	 *            der zu erstellende Stichtag
	 * @throws SQLException
	 * @throws ClassNotFoundException 
	 */
	public void newStichtag(Stichtag stichtag) throws SQLException, ClassNotFoundException {
		String[][] db_werte = new String[2][1];
		// spaltennamen
		db_werte[0][0] = "stichtag";
		// werte
		db_werte[1][0] = "" + stichtag.getStichtag();

		// Datenbank updaten
		stichtag.setId(datenbankSchnittstelle.insert("stichtag", db_werte));
		this.add(stichtag);
	}
	
	/**
	 * Speichert einen Stichtag in der Datenbank und im StichtagRepository.
	 * 
	 * @param stichtag Der zu speichernde Stichtag.
	 * @throws SQLException
	 * @throws IllegalArgumentException
	 * @throws ClassNotFoundException
	 */
	public void saveStichtag(Stichtag stichtag) throws SQLException, IllegalArgumentException, ClassNotFoundException {
		String[][] db_werte = new String[2][3];
		// spaltennamen
		db_werte[0][0] = "id";
		db_werte[0][1] = "stichtag";
		db_werte[0][2] = "status";
		// werte
		db_werte[1][0] = ""+stichtag.getId();
		db_werte[1][1] = ""+stichtag.getStichtag();
		db_werte[1][2] = ""+stichtag.getStatus();

		datenbankSchnittstelle.update("stichtag", "id='" + stichtag.getId() + "'", db_werte);
	}
	
	
	
	/**
	 * Löschen eines Stichtag aus der Datenbank und dem StichtagRepository.
	 * 
	 * @param stichtag
	 * @throws SQLException
	 * @throws ClassNotFoundException
	 */
	public void delStichtag(Stichtag stichtag) throws SQLException, ClassNotFoundException {
		if(stichtag != null && stichtag.getStatus() != Stichtag.STICHTAGAUSGEFUEHRT){
			datenbankSchnittstelle.del("stichtag", "id='" + stichtag.getId() + "'");
			for (int i = 0; i < this.size(); i++) {
				if (this.get(i) == stichtag) {
					this.remove(i);
					this.trimToSize();
				}
			}
		}
	}

	/**
	 * Gibt die einzig erlaubte Instanz des BenutzerRepository zurück.
	 * 
	 * @return Instanz des BenutzerRepository
	 * @throws ClassNotFoundException
	 *             Classe nicht gefunden
	 * @throws SQLException
	 *             SQL Exception
	 */
	public static StichtagRepository getInstance()
			throws ClassNotFoundException, SQLException {
		if (stichtagRepository == null) {
			stichtagRepository = new StichtagRepository();
		}
		return stichtagRepository;
	}

	
	
	/**
	 * Liefert den nächsten auszuführenden Stichtag als Text.
	 * 
	 * @return stichtagtext Der Stichtag im als String im Format (d.m.y)
	 */
	public String getNextStichtagAsString() {
		GregorianCalendar greg = new GregorianCalendar();
		long nextStichtag = -1;
		for (int i = 0; i < this.size(); i++) {
			if(this.get(i).getStatus() != Stichtag.STICHTAGAUSGEFUEHRT) {
				if (this.get(i).getStichtag() < nextStichtag || nextStichtag==-1 ) {
					nextStichtag = this.get(i).getStichtag();
				}
			}
		}
		if(nextStichtag == -1) {
			return "nicht festgelegt";
		} else {
			greg.setTimeInMillis(nextStichtag);
			return (greg.get(Calendar.DAY_OF_MONTH))+"."+(greg.get(Calendar.MONTH)+1)+"."+greg.get(Calendar.YEAR);
		}
	}
}
